home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / littlest / littl-st.lha / winprim.c < prev   
C/C++ Source or Header  |  1993-08-10  |  10KB  |  425 lines

  1. /*
  2.     stdwin window primitives
  3.     written by tim budd, january 1989
  4. */
  5.  
  6. # include "stdwin.h"
  7. /* undefine stdwin's NOARGS so it doesn't conflict with mine */
  8. # undef NOARGS
  9. # include <stdio.h>
  10. # include "env.h"
  11. # include "memory.h"
  12. # include "names.h"
  13.  
  14. extern object trueobj, falseobj;
  15. extern boolean parseok;
  16. extern int initial;
  17.  
  18. /* report a fatal system error */
  19. noreturn sysError(s1, s2)
  20. char *s1, *s2;
  21. {    char buffer[1024];
  22.  
  23.     if (initial) {
  24.         ignore fprintf(stderr,"%s\n%s\n", s1, s2);
  25.         }
  26.     else {
  27.         ignore sprintf(buffer,"%s %s", s1, s2);
  28.         wmessage(buffer);
  29.         }
  30.     ignore abort();
  31. }
  32.  
  33. /* report a nonfatal system error */
  34. noreturn sysWarn(s1, s2)
  35. char *s1, *s2;
  36. {    char buffer[1024];
  37.  
  38.     if (initial) {
  39.         ignore fprintf(stderr,"%s\n%s\n", s1, s2);
  40.         }
  41.     else {
  42.         ignore sprintf(buffer,"%s %s", s1, s2);
  43.         wmessage(buffer);
  44.         }
  45. }
  46.  
  47. compilWarn(selector, str1, str2)
  48. char *selector, *str1, *str2;
  49. {    char buffer[1024];
  50.  
  51.     if (initial) {
  52.         ignore fprintf(stderr,"compiler warning: Method %s : %s %s\n", 
  53.             selector, str1, str2);
  54.         }
  55.     else {
  56.         ignore sprintf(buffer,"warn: %s %s", str1, str2);
  57.         wmessage(buffer);
  58.         }
  59. }
  60.  
  61. compilError(selector, str1, str2)
  62. char *selector, *str1, *str2;
  63. {    char buffer[1024];
  64.  
  65.     if (initial) {
  66.         ignore fprintf(stderr,"compiler error: Method %s : %s %s\n", 
  67.             selector, str1, str2);
  68.         }
  69.     else {
  70.         ignore sprintf(buffer,"error: %s %s", str1, str2);
  71.         wmessage(buffer);
  72.         }
  73.     parseok = false;
  74. }
  75.  
  76. noreturn dspMethod(cp, mp)
  77. char *cp, *mp;
  78. {
  79.     /*ignore fprintf(stderr,"%s %s\n", cp, mp);*/
  80. }
  81.  
  82. givepause()
  83. {    char buffer[80];
  84.  
  85.     if (initial) {
  86.         ignore fprintf(stderr,"push return to continue\n");
  87.         ignore gets(buffer);
  88.         }
  89.     else
  90.         wmessage("wait to continue");
  91. }
  92.  
  93. static object newPoint(x, y)
  94. int x, y;
  95. {    object newObj;
  96.  
  97.     newObj = allocObject(2);
  98.     setClass(newObj, globalSymbol("Point"));
  99.     basicAtPut(newObj, 1, newInteger(x));
  100.     basicAtPut(newObj, 2, newInteger(y));
  101.     return newObj;
  102. }
  103.  
  104. /* windows and text edit buffers are maintained in
  105.    a single structure */
  106. # define WINDOWMAX 15
  107. static struct {
  108.     WINDOW *w;
  109.     TEXTEDIT *tp;
  110.     } ws[WINDOWMAX];
  111.  
  112. /* menus are maintained in a similar structure */
  113. # define MENUMAX 20
  114. static MENU *mu[MENUMAX];
  115.  
  116. /* current event record */
  117. static EVENT evrec;
  118.  
  119. static int findWindow(w)
  120. WINDOW *w;
  121. {    int i;
  122.     for (i = 0; i < WINDOWMAX; i++)
  123.         if (w == ws[i].w) return(i);
  124.     sysError("can't find window","");
  125.     return(0);
  126. }
  127.  
  128. static void drawproc(w, left, top, right, bottom)
  129. WINDOW *w;
  130. int left, top, right, bottom;
  131. {    int i;
  132.  
  133.     i = findWindow(w);
  134.     if (ws[i].tp) tedraw(ws[i].tp);
  135. }
  136.  
  137. object sysPrimitive(primitiveNumber, arguments)
  138. int primitiveNumber;
  139. object *arguments;
  140. {    int i, j, k;
  141.     int p1, p2, p3, p4;
  142.     char *c;
  143.     WINDOW *w;
  144.     object returnedObject;
  145.  
  146.     returnedObject = nilobj;
  147.  
  148.     switch(primitiveNumber) {
  149.     case 160:    /* window open */
  150.         i = intValue(arguments[0]); /* win number */
  151.         if (ws[i].w) break;    /* already open */
  152.         c = charPtr(arguments[1]);  /* title */
  153.         j = intValue(arguments[2]); /* text or not */
  154.         if (j) {
  155.             ws[i].w = w = wopen(c, drawproc);
  156.             wgetwinsize(w, &j, &k);
  157.             ws[i].tp = tecreate(w, 0, 0, j, k);
  158.             }
  159.         else {
  160.             ws[i].w = wopen(c, NULL);
  161.             ws[i].tp = 0;
  162.             }    
  163.         break;
  164.         
  165.     case 161:    /* variety of simple actions */
  166.         i = intValue(arguments[0]); /* win number */
  167.         if (! (w = ws[i].w)) break;    /* return if no open */
  168.         j = intValue(arguments[1]); /* action */
  169.         switch(j) {
  170.             case 1: 
  171.                 if (ws[i].tp) {tefree(ws[i].tp);
  172.                         ws[i].tp = NULL;}
  173.                 ws[i].w = NULL; wclose(w); break;
  174.             case 2: wbegindrawing(w); break;
  175.             case 3: wenddrawing(w); break; 
  176.             case 4: wsetactive(w); break;
  177.             case 5: if (ws[i].tp) tedraw(ws[i].tp); break;
  178.             case 6: wgetwinsize(w, &i, &j); 
  179.                 returnedObject = newPoint(i, j); break;
  180.         }
  181.         break;
  182.  
  183.     case 162:    /* one int arg actions */
  184.         i = intValue(arguments[0]); /* win number */
  185.         if (! (w = ws[i].w)) break;    /* return if no open */
  186.         i = intValue(arguments[1]); /* action */
  187.         j = intValue(arguments[2]); /* x */
  188.         switch(i) {
  189.             case 1:  /* set timer */
  190.                 wsettimer(w, j); break;
  191.             case 2:    /* menu attach */
  192.                 if (j >= 0 && j < MENUMAX && mu[j] != 0)
  193.                     wmenuattach(w, mu[j]); 
  194.                 break;
  195.             case 3:    /* menu detach */
  196.                 if (j >= 0 && j < MENUMAX && mu[j] != 0)
  197.                     wmenudetach(w, mu[j]); 
  198.                 break;
  199.         }
  200.         break;
  201.  
  202.     case 163:    /* two int arg actions */
  203.         i = intValue(arguments[0]); /* win number */
  204.         if (! (w = ws[i].w)) break;    /* return if not open */
  205.         i = intValue(arguments[1]); /* action */
  206.         j = intValue(arguments[2]); /* x */
  207.         k = intValue(arguments[3]); /* y */
  208.         switch(i) {
  209.             case 2: wsetdocsize(w, j, k); break;
  210.             case 3: wsetorigin(w, j, k); break;
  211.         }
  212.         break;
  213.  
  214.     case 164:    /* title */
  215.         i = intValue(arguments[0]); /* win number */
  216.         if (! (w = ws[i].w)) break;    /* return if no open */
  217.         c = charPtr(arguments[1]);
  218.         wsettitle(w, c);
  219.         break;
  220.  
  221.     case 165:    /* get text */
  222.         i = intValue(arguments[0]);
  223.         if (ws[i].tp)
  224.             returnedObject = newStString(tegettext(ws[i].tp));
  225.         break;
  226.  
  227.     case 166:    /* replace text */
  228.         i = intValue(arguments[0]);
  229.         if (ws[i].tp) {
  230.             j = tegetlen(ws[i].tp);
  231.             tesetfocus(ws[i].tp, j, j);
  232.             /* add newline */
  233.             tereplace(ws[i].tp, "\n");
  234.             tereplace(ws[i].tp, charPtr(arguments[1]));
  235.             wsetdocsize(ws[i].w, 0, tegetbottom(ws[i].tp));
  236.             }
  237.         break;
  238.  
  239.     case 170: getevent:    /* get next event */
  240.         wgetevent(&evrec);
  241.         i = findWindow(evrec.window);
  242.         if (ws[i].tp) {
  243.             if (evrec.type == WE_SIZE) {    /* change textedit size */
  244.                 wgetwinsize(w = ws[i].w, &j, &k);
  245.                 temovenew(ws[i].tp, 0, 0, j, k);
  246.                 wsetdocsize(ws[i].w, 0, tegetbottom(ws[i].tp));
  247.                 goto getevent;
  248.                 }
  249.             if (teevent(ws[i].tp, &evrec))
  250.                 goto getevent;
  251.             }
  252. /*fprintf(stderr,"returning event type %d %d\n", evrec.type, evrec.u.where.clicks);*/
  253.         returnedObject = newInteger(evrec.type);
  254.         break;
  255.  
  256.     case 171:    /* integer event info */
  257.         i = intValue(arguments[0]);
  258.         switch(i) {
  259.         case 1:     /* event window */
  260.             j = findWindow(evrec.window); break;
  261.         case 2:        /* event menu */
  262.             j = evrec.u.m.id - 1; break;
  263.         case 3:        /* menu item */
  264.             j = evrec.u.m.item + 1; break;
  265.         case 4:        /* char typed */
  266.             j = evrec.u.character; break;
  267.         case 5:        /* mouse y */
  268.             j = evrec.u.where.v; break;
  269.         case 6:        /* mouse button */
  270.             j = evrec.u.where.button; break;
  271.         case 7:        /* mouse click number */
  272.             j = evrec.u.where.clicks;
  273.         case 8:        /* char typed */
  274.             j = evrec.u.character;
  275.         case 9:        /* command typed */
  276.             j = evrec.u.command;
  277.         }
  278.         returnedObject = newInteger(j);
  279.         break;
  280.  
  281.     case 172:    /* more general event info */
  282.         i = intValue(arguments[0]);
  283.         switch(i) {
  284.         case 1:        /* mouse down point */
  285.             returnedObject = newPoint(evrec.u.where.h, 
  286.                 evrec.u.where.v); 
  287.             break;
  288.         }
  289.         break;
  290.  
  291.     case 180:    /* new menu */
  292.         i = intValue(arguments[0]); /* menu id */
  293.         c = charPtr(arguments[1]); /* title */
  294.         mu[i] = wmenucreate(i+1, c);    /* avoid meny id 0 */
  295.         break;
  296.  
  297.     case 181:    /* menu item */
  298.         i = intValue(arguments[0]); /* menu number */
  299.         c = charPtr(arguments[1]); /* title */
  300.         if (isInteger(arguments[2]))
  301.             j = intValue(arguments[2]);
  302.         else j = -1;
  303.         wmenuadditem(mu[i], c, j);
  304.         break;
  305.  
  306.     case 182:    /* check menu items */
  307.         i = intValue(arguments[0]); /* menu number */
  308.         j = intValue(arguments[1]); /* item number */
  309.         k = intValue(arguments[2]); /* action */
  310.         p1 = intValue(arguments[3]); /* flag */
  311.         switch(k) {
  312.             case 1:    /* enable/disable */
  313.                 wmenuenable(mu[i],j-1,p1); break;
  314.             case 2: /* check/no check */
  315.                 wmenucheck(mu[i],j-1,p1); break;
  316.         }
  317.         break;
  318.  
  319.     case 190:    /* print text graphics */
  320.         i = intValue(arguments[0]); /* x */
  321.         j = intValue(arguments[1]); /* y */
  322.         c = charPtr(arguments[2]); /* text */
  323.         wdrawtext(i, j, c, -1);
  324.         break;
  325.  
  326.     case 192:    /* points */
  327.         i = intValue(arguments[0]); /* action */
  328.         p1 = intValue(arguments[1]);
  329.         p2 = intValue(arguments[2]);
  330.         p3 = intValue(arguments[3]);
  331.         p4 = intValue(arguments[4]);
  332.         switch(i) {
  333.             case 1:  /* draw line */
  334.                 wdrawline(p1, p2, p3, p4); break;
  335.         }
  336.         break;
  337.  
  338.     case 193:    /* circles and the like */
  339.         i = intValue(arguments[0]); /* action */
  340.         p1 = intValue(arguments[1]);
  341.         p2 = intValue(arguments[2]);
  342.         p3 = intValue(arguments[3]);
  343.         switch(i) {
  344.             case 1:        /* draw circle */
  345.                 wdrawcircle(p1,p2,p3); break;
  346.             case 2:        /* draw char */
  347.                 wdrawchar(p1,p2,p3); break;
  348.         }
  349.         break;
  350.  
  351.     case 194:    /* rectangles */
  352.         i = intValue(arguments[0]); /* action */
  353.         p1 = intValue(arguments[1]);
  354.         p2 = intValue(arguments[2]);
  355.         p3 = intValue(arguments[3]);
  356.         p4 = intValue(arguments[4]);
  357.         switch(i) {
  358.             case 1:        /* draw box */
  359.                 wdrawbox(p1,p2,p3,p4); break;
  360.             case 2:     /* paint */
  361.                 wpaint(p1,p2,p3,p4); break;
  362.             case 3:        /* erase */
  363.                 werase(p1,p2,p3,p4); break;
  364.             case 4:        /* invert */
  365.                 winvert(p1,p2,p3,p4); break;
  366.         }
  367.         break;
  368.  
  369.     case 195:    /* shading */
  370.         i = intValue(arguments[0]); /* action */
  371.         p1 = intValue(arguments[1]);
  372.         p2 = intValue(arguments[2]);
  373.         p3 = intValue(arguments[3]);
  374.         p4 = intValue(arguments[4]);
  375.         j = intValue(arguments[5]);
  376.         switch(i) {
  377.             case 1:        /* shading */
  378.                 wshade(p1,p2,p3,p4,j); break;
  379.             }
  380.         break;
  381.  
  382.     case 200:    /* issue a message */
  383.         c = charPtr(arguments[0]);
  384.         wmessage(c);
  385.         break;
  386.  
  387.     case 201:    /* ask a question */
  388.         { char replybuffer[120];
  389.         strcpy(replybuffer, charPtr(arguments[1]));
  390.         if (waskstr(charPtr(arguments[0]), replybuffer, sizeof replybuffer))
  391.             returnedObject = newStString(replybuffer);
  392.         }
  393.         break;
  394.     
  395.     case 202:    /* asky a binary question */
  396.         i = waskync(charPtr(arguments[0]), intValue(arguments[1]));
  397.         if (i == 1) returnedObject = trueobj;
  398.         else if (i == 0) returnedObject = falseobj;
  399.         break;
  400.  
  401.     case 203:    /* ask for a file */
  402.         { char replybuffer[120];
  403.         strcpy(replybuffer, charPtr(arguments[1]));
  404.         if (waskfile(charPtr(arguments[0]), replybuffer, 120, intValue(arguments[2])))
  405.             returnedObject = newStString(replybuffer);
  406.         }
  407.         break;
  408.  
  409.     case 204:    /* error message */
  410.         wperror(charPtr(arguments[0]));
  411.         break;
  412.         
  413.     case 205:    /* beep */
  414.         wfleep();
  415.         break;
  416.  
  417.     default:
  418.         fprintf(stderr,"primitive not implmented yet %d\n",
  419.             primitiveNumber);
  420.         sysError("primitive not done","");
  421.     }
  422.  
  423.     return returnedObject;
  424. }
  425.